Инструкция по созданию серверного приложения на nodejs + express + mongoDB


Для понимания подойдет простейший пример, в котором мы сможем создавать, читать, обновлять и удалять простые текстовые документы

Установка компонентов

На официальном сайте node (https://nodejs.org/) есть подробные инструкции по установке
Примеры для самого распространенного, если не хочется переходить и искать

Для centos:

1
2
3
$ curl —silent —location https://rpm.nodesource.com/setup_9.x | sudo bash -
$ sudo yum -y install nodejs
$ sudo yum install gcc-c++ make

Для ubuntu:

1
2
3
$ curl -sL https://deb.nodesource.com/setup_9.x | sudo -E bash -
$ sudo apt-get install -y nodejs
$ sudo apt-get install -y build-essential

Затем организуем папку для проекта и в ней выполняем команду для его инициализации:
initialization in it:

1
$ npm init

Отвечаем на вопросы следующие вопросы

  • Название проекта
  • Версия проекта
  • Описание проекта
  • Входная точка
  • Команда на тестирование
  • Репозиторий гитхаба
  • Ключевые слова проекта
  • Автор проекта
  • Лицензия
И подтверждаем, после чего в папке появляется файл package.json, описывающий проект

Теперь установим оставшиеся компоненты: Express и MongoDB(последняя версия плагина некорректно работает с БД, так что лучше установить более раннюю):

1
$ npm install --save express mongodb@2.2.16

Так же для удобства обработки url-encoded запросов устанавливаем body-parser:

1
$ npm install --save body-parser

И для удобства разработки хорошо бы установить Nodemon, который каждый раз будет перезапускать сервер, когда будут изменяться какие-либо файлы:

1
$ npm install --save-dev nodemon

А дальше для подключения Nodemon надо добавить следующее в package.json:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{
"name": "notable",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error^ no test specified\" && exit 1",
"dev": "nodemon server.js"
},
"author": "",
"license": "ISC",
"dependencies": {
"body-parser": "^1.18.2",
"express": "^4.16.2",
"mongodb": "^2.2.16"
},
"devDependencies": {
"nodemon": "^1.14.2"
}
}

Чтобы тестировать наше приложение установим postman(https://www.getpostman.com/) – он будет имитировать запросы

Запуск сервера

Создадим файл server.js,в котором пропишем зависимости (то с чем будет работать сервер), укажем порт и запустим прослушивание:

1
2
3
4
5
6
7
8
const express        = require('express');
const MongoClient = require('mongodb').MongoClient;
const bodyParser = require('body-parser');
const app = express();
const port = 8080;
app.listen(port, () => {
console.log('We are live on ' + port);
});

Запустим сервер:

1
npm run dev

В терминале теперь можно видеть сообщение “We are live on port 8080”

Структура проекта

Для более удобного структурирования проекта стоит создать папку app, в ней создаем папку routes, а в ней – файлы index.js и note_routes.js

Таким образом структура выглядит так: в app/routes – наши обработчики маршрутов, в папке node_modules – модули нашего проекта, а server.js непосредственно описывает наш сервер.

Подключение БД

В корень проекта добавляем директорию config, создаем в ней файл db.js.
В файл db.js пишем следующее:

1
2
3
module.exports = {
url : 'mongodb://localhost:27017/<yourDataBase>'
};

А в файл server.js добавляем:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
const express        = require('express');
const MongoClient = require('mongodb').MongoClient;
const bodyParser = require('body-parser');
const db = require(‘./config/db’);
const app = express();
const port = 8080;
app.use(bodyParser.urlencoded({ extended: true }));
MongoClient.connect(db.url, (err, database) => {
if (err) return console.log(err)
require(‘./app/routes’)(app, database);
app.listen(port, () => {
console.log('We are live on ' + port);
});
});

Создание текстового документа

В app/routes/note_routes.js пишем:

1
module.exports = function(app, db) { };

В app/routes/index.js:

1
2
3
4
5
6
7
8
9
10
11
12
13
const noteRoutes = require('./note_routes');
module.exports = function(app, db) {
app.post('/notes', (req, res) => {
const note = { text: req.body.body, title: req.body.title };
db.collection('notes').insert(note, (err, result) => {
if (err) {
res.send({ 'error': 'An error has occurred' });
} else {
res.send(result.ops[0]);
}
});
});
};

Чтение документа

По аналогии с app.post, пишем другой метод:

1
2
3
4
5
6
7
8
9
10
11
app.get('/notes/:id', (req, res) => {
const id = req.params.id;
const details = { '_id': new ObjectID(id) };
db.collection('notes').findOne(details, (err, item) => {
if (err) {
res.send({'error':'An error has occurred'});
} else {
res.send(item);
}
});
});

Удаление документа

По аналогии с app.post, пишем другой метод:

1
2
3
4
5
6
7
8
9
10
11
app.delete('/notes/:id', (req, res) => {
const id = req.params.id;
const details = { '_id': new ObjectID(id) };
db.collection('notes').remove(details, (err, item) => {
if (err) {
res.send({'error':'An error has occurred'});
} else {
res.send('Note ' + id + ' deleted!');
}
});
});

Обновление документа

По аналогии с app.post, пишем другой метод:

1
2
3
4
5
6
7
8
9
10
11
12
app.put ('/notes/:id', (req, res) => {
const id = req.params.id;
const details = { '_id': new ObjectID(id) };
const note = { text: req.body.body, title: req.body.title };
db.collection('notes').update(details, note, (err, result) => {
if (err) {
res.send({'error':'An error has occurred'});
} else {
res.send(note);
}
});
});

Тестирование

Postman позволяет указывать тип запроса (get, post, put, update), адрес и порт для запроса, а также добавлять в тело запроса различные параметры, например, пустой POST-запрос на 8080 порт.
По выполнении запроса, мы видим ответ сервера

alt-текст
Пример POST-запроса с заполненным телом:

alt-текст
Пусть сервер выводит запрос в консоль сервера, тогда мы увидим:

alt-текст

Ссылки

Для установки node
https://nodejs.org/en/download/package-manager/#enterprise-linux-and-fedora
Для установки postman
https://www.getpostman.com/
Аналогичные статьи

  1. https://medium.freecodecamp.com/building-a-simple-node-js-api-in-under-30-minutes-a07ea9e390d2#.eybmlr1g9
  2. https://habrahabr.ru/company/ruvds/blog/321104/
  3. https://loftblog.ru/material/4-podklyuchenie-bazy-dannyx-k-express/
  4. http://coenraets.org/blog/2012/10/creating-a-rest-api-using-node-js-express-and-mongodb/